"""
hashlib模块提供了常见的摘要算法，如MD5，SHA1

摘要算法：(又称哈希算法，散列算法）：
    原理：它通过一个函数，把任意长度的数据转换为一个长度固定的额数据串（通常
    用16进制的字符串表示）

    "lifeibiao is a good man"
"""
import hashlib
# MD5
# 最常见的摘要算法，速度快，生成的结果是128位字节，通常用32位16进制字符串表示
s1 = b"lifeibiao is a good man"
m5 = hashlib.md5()
m5.update(s1)
print(m5.hexdigest)
# 如果数据量比较大，可以分多次调用update，最后的结果是一样的
m6 = hashlib.md5()
m6.update(b'lifeibiao is')
m6.update(b'a good man')
print(m6.hexdigest)

# SHA1
# 调用SHA1与调用MD5完全一样，SHA1的结果是160bit字节，通常用40位16进制字符串表示
s2 = b"lifeibiao is a good man"
sh1 = hashlib.sha1()
sh1.update(s2)
print(sh1.hexdigest())

# 更安全的
# SHA256
# SHA5125
# 越安全的算法不仅越慢，而且摘要会越长

# 有没有两个不同的数据通过hash算法后得到了相同的摘要呢？
# 有这种可能性，因为摘要算法是将无限多的数据映射到有限的集合中，如果两个数据的摘要
# 相同称之为碰撞，可能出现，但是非常渺茫

'''
应用：
    任何允许用户登录的网站都会存储用户登录的用户名和密码，那么密码一般存
    储的是原始密码的摘要值。
    
    lifeibiao - good明文存到数据中，如果数据库泄露，所有用户信息会暴露
    
    正确的保存口令方式不是存储明文，而是存储口令的摘要，当用户登录时，首先
    会计算输入明文口令的摘要，和数据库中的对比，如果一直说明口令正确，
    否则一定错误
    
'''
